package com.demo01;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Demo02 {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取构造方法的代码演示
        //获取Class对象
        Class c = Person.class;
        //获取所有的构造方法
        //getConstructors()获取能获取到的构造方法，受权限限制
        Constructor[] cons = c.getConstructors();
        for (int i = 0; i < cons.length; i++) {
            System.out.println(cons[i]);
        }
        System.out.println("================");
        //getDeclaredConstructors()能够获取所有的构造方法 包括private修饰的
        Constructor[] cons2 = c.getDeclaredConstructors();
        for (int i = 0; i < cons2.length; i++) {
            System.out.println(cons2[i]);
        }
        System.out.println("===============");

        //获取单个构造方法
        Constructor con1 = c.getConstructor(String.class);
        System.out.println(con1);

        Constructor con2 = c.getDeclaredConstructor(String.class, int.class);
        System.out.println(con2);

        Constructor con3 = c.getConstructor();
        System.out.println(con3);

        Constructor con4 = c.getConstructor(String.class, int.class, String.class);
        System.out.println(con4);

        System.out.println("通过构造方法类中的Constructor的方法 创建对象");
        //通过构造方法类中的Constructor的方法 创建对象
        Person p1 = (Person)con4.newInstance("小明",18,"万福中心");
        System.out.println(p1.toString());
        p1.method1();

        //通过getDeclaredXXX方法可以获取到私有的构造方法、方法、成员变量
        //但是使用的时候 还需要进行暴力访问
        //取消Java语言访问检查
        con2.setAccessible(true);
        Person p2 = (Person)con2.newInstance("小红",17);
        System.out.println(p2);
    }
}
